all repos — caroster @ v8.2

[Octree] Group carpool to your event https://caroster.io

frontend/pages/api/nauth/[...nextauth].js (view raw)

  1import NextAuth from 'next-auth';
  2import CredentialsProvider from 'next-auth/providers/credentials';
  3import GoogleProvider from 'next-auth/providers/google';
  4
  5const {STRAPI_URL = 'http://localhost:1337'} = process.env;
  6
  7const authHandler = NextAuth({
  8  providers: [
  9    CredentialsProvider({
 10      name: 'magic-link',
 11      credentials: {
 12        token: {label: 'Token', type: 'password'},
 13      },
 14      async authorize(credentials) {
 15        const response = await fetch(`${STRAPI_URL}/api/auth/magic-link`, {
 16          method: 'POST',
 17          headers: {'Content-Type': 'application/json'},
 18          body: JSON.stringify({
 19            token: credentials.token,
 20          }),
 21        });
 22        const data = await response.json();
 23        if (!data?.jwt) return null;
 24        else {
 25          const {user, jwt} = data;
 26          return {...user, jwt};
 27        }
 28      },
 29    }),
 30    GoogleProvider({
 31      clientId: process.env.GOOGLE_CLIENT_ID,
 32      clientSecret: process.env.GOOGLE_CLIENT_SECRET,
 33    }),
 34  ],
 35  session: {
 36    jwt: true,
 37  },
 38  callbacks: {
 39    jwt: async params => {
 40      const {token, user, account} = params;
 41
 42      // Google Auth
 43      if (account?.provider === 'google') {
 44        const response = await fetch(
 45          `${STRAPI_URL}/api/auth/${account.provider}/callback?access_token=${account?.access_token}`
 46        );
 47        const data = await response.json();
 48
 49        if (data.error) {
 50          console.error(
 51            `Error from Strapi on authentication with Google: `,
 52            data.error
 53          );
 54          throw new Error(data.error?.message || data.error);
 55        }
 56
 57        token.id = data.user.id;
 58        token.jwt = data.jwt;
 59        token.email = data.user.email;
 60        token.username = data.user.name;
 61        token.lang = data.user.lang?.toLowerCase();
 62        token.provider = account.provider;
 63      }
 64
 65      // Strapi Auth
 66      else if (user) {
 67        token.id = user.id;
 68        token.jwt = user.jwt;
 69        token.email = user.email;
 70        token.username = user.firstname;
 71        token.lang = user.lang?.toLowerCase();
 72        token.provider = account.provider;
 73      }
 74
 75      return token;
 76    },
 77    session: async params => {
 78      const {session, token} = params;
 79      if (session) {
 80        try {
 81          const response = await fetch(`${STRAPI_URL}/api/users/me`, {
 82            headers: {
 83              'Content-Type': 'application/json',
 84              Authorization: `Bearer ${token.jwt}`,
 85            },
 86          });
 87          const profile = await response.json();
 88          session.profile = profile;
 89        } catch (error) {
 90          console.error(error);
 91        }
 92
 93        session.token = token;
 94        session.user.name = token.username;
 95        session.user.lang = token.lang;
 96      }
 97      return session;
 98    },
 99  },
100  pages: {
101    signIn: '/auth/login',
102    error: '/auth/login',
103  },
104});
105
106export default async function handler(...params) {
107  await authHandler(...params);
108}